package main;

import java.awt.Color;
import java.beans.PropertyChangeSupport;

/**
 * Klasa przechowujaca dane przeciwnika
 * @author Maciej Krawczyk
 */
public class OpponentData {

	/**Karty przeciwnika*/
	private String[] cards;
	/**Rola przeciwnika*/
	private String blind;
	/**Aktualna stawka oraz zetony przeciwnika*/
	private int stake, chips;
	/**Panel przeciwnika odpowiadajacy danym*/
	private OpponentPanel op;
	/**Pomocnik synchronizacji pomiedzy danym a GUI*/
	private PropertyChangeSupport pcs;
	
	/**
	 * Konstruktor instancji zawierajacej dane przeciwnika
	 * @param p numer przeciwnika
	 */
	public OpponentData(OpponentPanel p) {
		this.op = p;
		pcs = new PropertyChangeSupport(this);
		pcs.addPropertyChangeListener(op);
		this.cards = new String[4];
	}
	
	/**
	 * Metoda ustawia role przeciwnika
	 * @param blind rola przeciwnika
	 */
	public void setBlind(String blind) {
		String old = this.blind;
		this.blind = blind;
		pcs.firePropertyChange("setBlind", old, this.blind);
	}
	
	/**
	 * Metoda ustawia stawke przeciwnika
	 * @param stake numer przeciwnika
	 */
	public void setStake(int stake) {
		int old = this.stake;
		this.stake = stake;
		pcs.firePropertyChange("setStake", old, this.stake);
	}
	
	/**
	 * Metoda ustawia zetony przeciwnika
	 * @param chips liczba zetonow
	 */
	public void setChips(int chips) {
		int old = this.chips;
		this.chips = chips;
		pcs.firePropertyChange("setChips", old, this.chips);
		
	}
	
	/**
	 * Metoda ustawia karty przeciwnika
	 * @param cards karty przeciwnika
	 */
	public void setCards(String cards) { 
		this.cards[0] = cards.substring(0, 2);
		this.cards[1] = cards.substring(2, 4);
		this.cards[2] = cards.substring(4, 6);
		this.cards[3] = cards.substring(6, 8);	
	}
	
	/**
	 * Akcesor zwracajacy stawke przeciwnika
	 * @return wysokosc stawki
	 */
	public int getStake() {
		return stake;
	}
	
	/**
	 * Akcesor zwracajacy zetony przeciwnika 
	 * @return liczba zetonow
	 */
	public int getChips() {
		return chips;
	}
	
	/**Metoda odpowiadajaca za zagranie "Check"*/
	public void check() {
		op.setState("Check");
	}
	
	/**
	 * Metoda podbija stawke przeciwnika
	 * @param stake wysokosc stawki
	 * @param state komunikat w panelu przeciwnika
	 */
	public void up(int stake, String state) {
		setChips(chips - (stake - this.stake));
		setStake(stake);
		op.setState(state);
	}
	
	/**Metoda odpowiada za zagranie "Fold" przeciwnika*/
	public void fold() {
		GuiData.foldStake += getStake();
		setStake(0);
		op.setBackground(Color.GRAY);
		op.setOpaque(true);
		op.setState("Folded");
	}
	
	/**Metoda odpowiada za zagranie "All-In" przeciwnika*/
	public void allIn() {
		setStake(getStake() + getChips());
		setChips(0);
		op.setState("All-In");
	}
	
	/**
	 * Metoda ustawiajaca komunikat informujacy o ruchu przeciwnika
	 * @param state komunikat informujacy o ruchu jaki wykonal przeciwnik
	 */
	public void setState(String state) {
		op.setState(state);
	}
}
